﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;

namespace Controleur
{
    /**
     * @author PAN
     * @date Juin 2010
     * @brief La classe ModeSelection dérive de ModeEdition et correspond à l'outil sélection l'onglet Edition
     */
    public class ModeSelection : ModeEdition 
    {
        /***********************/
        /**** Attributs ****/
        /***********************/

        protected static Microsoft.Ink.Strokes objets_selectionnes;  //uniquement de type encre pour le moment

        /***********************/
        /**** Constructeurs ****/
        /***********************/

        /** 
         * ModeSelection(System.Drawing.Color _couleur, int _epaisseur)
         * 
         * @brief Constructeur
         * @param System.Drawing.Color _couleur : la couleur des traits par défaut
         * @param int _epaisseur : l'épaisseur des traits par défaut
         * @return void
         */
        public  ModeSelection(System.Drawing.Color _couleur, int _epaisseur):base(_couleur,_epaisseur)
        {
           
        }

        /** 
         * ModeSelection()
         * 
         * @brief Constructeur par défaut
         * @return void
         */
        public ModeSelection()
            : base()
        {
            
        }




        /***************************************/
        /** Actions spécifiques à chaque mode **/
        /***************************************/


        /**
         * ActionZoneDessin(Microsoft.Ink.Stroke _stroke)
         * 
         * @brief écriture sur la zone de dessin
         * @param Stroke _stroke : objet contenant de nombreuses informations (analogue à ensemble de points)
         * @return void
        */
        public override void ActionZoneDessin(Microsoft.Ink.Stroke _stroke) 
        {
            objets_selectionnes = null;

            System.Drawing.Rectangle rectangle_englobant = _stroke.GetBoundingBox();

            objets_selectionnes = controleur.selection_objets(rectangle_englobant);

            if(objets_selectionnes != null){
                couleur = objets_selectionnes[0].DrawingAttributes.Color;
                epaisseur = (int)objets_selectionnes[0].DrawingAttributes.Width;
                opacite = objets_selectionnes[0].DrawingAttributes.Transparency * 100 / 255;
                controleur.setDrawingAttributes(objets_selectionnes[0].DrawingAttributes);
            }

            /*
            IEnumerator it = objets_selectionnes.GetEnumerator();

            while(it.MoveNext())
            {
               
                objets_selectionnes.Remove((Microsoft.Ink.Stroke)it.Current);

            }*/
            //objets_selectionnes.Move(100, 100);

            Console.WriteLine("nombre d'objets selectionnés : {0}", objets_selectionnes.Count);

        }



        /**
         * ActionBouton()
         * 
         * @brief clic sur le bouton sur le côté du stylet
         * @return void
        */
        public override void ActionBouton()
        {
            controleur.changerMode(new ModeCrayon(couleur,epaisseur));
        }



        /**
        * ActionEffacer(Microsoft.Ink.Strokes _strokes)
        * 
        * @brief tracer un trait sur la zone de dessin avec la "gomme"
        * @param Strokes _strokes : objet contenant de nombreuses informations (analogue à ensemble de stroke)
        * @return void
        */
        public override void ActionEffacer(Microsoft.Ink.Strokes _strokes) { }

        /**
        * ActionDoubleClic(Microsoft.Ink.Strokes _strokes)
        * 
        * @brief Action de double clic
        * @param Strokes _strokes : objet contenant de nombreuses informations (analogue à ensemble de stroke)
        * @return void
        */
        public override void ActionDoubleClic(Microsoft.Ink.Strokes _strokes) { }

        //accesseurs
        public Microsoft.Ink.Strokes getObjet_Selection()
        {
            return objets_selectionnes;
        }


        /**
          * setModeCouleur(System.Drawing.Color _couleur)
          * 
          * @brief : Change la couleur du mode
          * @param Color _couleur : nouvelle couleur
          * @return void
         */
        public override bool setCouleur(System.Drawing.Color _couleur)
        {
            bool resul = false;

            couleur = _couleur;

            if (objets_selectionnes != null)
            {
                for (int i = 0; i < objets_selectionnes.Count; i++)
                {
                    objets_selectionnes[i].DrawingAttributes.Color = _couleur;
                }
                resul = true;
            }
            return resul;
        }

        /**
          * setModeOpacite(int _opacite)
          * 
          * @brief : Change l'opacite du mode
          * @param int _opacite : la nouvelle opacite
          * @return void
         */
        public override bool setOpacite(int _opacite)
        {
            bool resul = false;
            if (_opacite < 0) _opacite = 0;
            if (_opacite > 255) _opacite = 255;

            opacite = _opacite;

            if (objets_selectionnes != null)
            {
                for (int i = 0; i < objets_selectionnes.Count; i++)
                {
                    objets_selectionnes[i].DrawingAttributes.Transparency = (byte)_opacite;
                }
                resul = true;
            }
            return resul;
        }

        /**
         * setModeEpaisseur(int _epaisseur)
         * 
         * @brief : Change l'epaisseur du mode
         * @param int _epaisseur : nouvelle épaisseur
         * @return void
        */
        public override bool setEpaisseur(int _epaisseur)
        {
            bool resul = false;
            if (_epaisseur < 0) _epaisseur = 0;

            epaisseur = _epaisseur;

            if (objets_selectionnes != null)
            {
                for (int i = 0; i < objets_selectionnes.Count; i++)
                {
                    objets_selectionnes[i].DrawingAttributes.Width = _epaisseur;
                }
                resul = true;
            }
            return resul;
        }



    }
}

